/*
 * @author PakJeon
 * @status done
 * @see 🚀 https://juejin.cn/post/7317908960757678114
 * @date 2024-12-11 11:41:28
 * @description LRU 缓存
 * @usage
 */

/**
 * 实现一个 LRU 缓存；
 * LRU算法的核心思想是保留最近被访问过的数据，而淘汰最久未被访问的数据。
 */
class LRUCache {
  // 定义一个Map对象，用于存储缓存数据
  private map = new Map()
  // 构造函数，接收一个容量参数
  constructor(private capacity: number) {}

  // 获取缓存数据
  get(key: string) {
    // 如果Map中不存在该key，则返回-1
    if (!this.map.has(key)) {
      return -1
    }
    // 将该key标记为最近使用
    this.makeRecentlyUsed(key)
    // 返回该key对应的值
    return this.map.get(key)
  }

  // 存入缓存数据
  put(key: string, value: string) {
    // 如果Map中已经存在该key，则更新该key对应的值，并将该key标记为最近使用
    if (this.map.has(key)) {
      this.map.set(key, value)
      this.makeRecentlyUsed(key)
      return
    }
    // 如果Map的大小已经达到容量上限，则删除最久未使用的key
    if (this.map.size >= this.capacity) {
      // 获取map对象中的第一个键
      const firstKey = this.map.keys().next().value
      this.map.delete(firstKey)
    }
    // 将新的key-value对存入Map中
    this.map.set(key, value)
  }

  // 将key标记为最近使用
  protected makeRecentlyUsed(key: string) {
    // 获取该key对应的值
    const val = this.map.get(key)
    // 删除该key
    this.map.delete(key)
    // 将该key重新存入Map中，以标记为最近使用
    this.map.set(key, val)
  }
}

// 导出LRUCache类
export default LRUCache
